package leetcode.editor.cn;

//编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性： 
//
// 
// 每行的元素从左到右升序排列。 
// 每列的元素从上到下升序排列。 
// 
//
// 
//
// 示例 1： 
//
// 
//输入：matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21
//,23,26,30]], target = 5
//输出：true
// 
//
// 示例 2： 
//
// 
//输入：matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21
//,23,26,30]], target = 20
//输出：false
// 
//
// 
//
// 提示： 
//
// 
// m == matrix.length 
// n == matrix[i].length 
// 1 <= n, m <= 300 
// -10⁹ <= matrix[i][j] <= 10⁹ 
// 每行的所有元素从左到右升序排列 
// 每列的所有元素从上到下升序排列 
// -10⁹ <= target <= 10⁹ 
// 
// Related Topics 数组 二分查找 分治 矩阵 👍 1097 👎 0

//Java：【240】 - 搜索二维矩阵 II
public class LeetCode_240_SearchA2dMatrixIi{
    public static void main(String[] args) {
        Solution solution = new LeetCode_240_SearchA2dMatrixIi().new Solution();
                // TO TEST
    }
    
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int n = matrix.length, m = matrix[0].length;
        return searchMid(matrix, target, 0, m-1);
    }

    // 从右上往左下找
    public boolean searchMid(int[][] matrix, int target, int x, int y){
        if(target <matrix[x][0] || target > matrix[matrix.length-1][y] ) return false;
        if(target == matrix[x][y]) return true;
        if(target < matrix[x][y])
            return searchMid(matrix, target, x, y-1);
        return searchMid(matrix, target, x+1, y);
    }
}
//leetcode submit region end(Prohibit modification and deletion)
    // 按层
public boolean searchMatrix(int[][] matrix, int target) {
    int n = matrix.length, m = matrix[0].length;
    for (int i = n-1; i >= 0; i--) {
        if(matrix[i][0]>target) continue;
        if(matrix[i][m-1]<target) continue;
        for (int j = 0; j < m; j++) {
            if(matrix[i][j] == target) return true;
        }
    }
    return false;
}
}
